package com.imut.lagain.service;
import org.slf4j.LoggerFactory;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.imut.lagain.entity.User;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 用户服务接口
 */
public interface IUserService extends IService<User> {
    
    /**
     * 根据openid查询用户
     * @param openid 微信openid
     * @return 用户信息
     */
    User getUserByOpenid(String openid);
    
    /**
     * 根据unionid查询用户
     * @param unionid 微信unionid
     * @return 用户信息
     */
    User getUserByUnionid(String unionid);
    
    /**
     * 根据手机号查询用户
     * @param phone 手机号
     * @return 用户信息
     */
    User getUserByPhone(String phone);
    
    /**
     * 根据用户名查询用户
     * @param username 用户名
     * @return 用户信息
     */
    User findByUsername(String username);
    
    /**
     * 创建新用户
     * @param openid 微信openid
     * @param unionid 微信unionid
     * @param nickname 昵称
     * @param avatarUrl 头像URL
     * @param phone 手机号
     * @return 创建的用户
     */
    User createUser(String openid, String unionid, String nickname, String avatarUrl, String phone);
    
    /**
     * 创建新用户（简单版本）
     * @param user 用户对象
     * @return 创建的用户
     */
    User createUser(User user);
    
    /**
     * 更新用户信息
     * @param user 用户信息
     * @return 是否更新成功
     */
    boolean updateUser(User user);
    
    /**
     * 更新用户信息
     * @param userId 用户ID
     * @param nickname 昵称
     * @param avatarUrl 头像URL
     * @param phone 手机号
     * @return 更新后的用户信息
     */
    User updateUser(Long userId, String nickname, String avatarUrl, String phone);
    
    /**
     * 获取活跃用户列表
     * @param page 分页参数
     * @return 活跃用户分页列表
     */
    IPage<User> getActiveUsers(Page<User> page);
    
    /**
     * 获取活跃用户列表
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 活跃用户分页列表
     */
    Page<User> getActiveUsers(int pageNum, int pageSize);
    
    /**
     * 查找有openid的活跃用户（用于推送）
     * @return 活跃用户列表
     */
    List<User> findActiveUsersWithOpenid();
    
    /**
     * 统计用户数量
     * @param isActive 是否活跃（null表示所有用户）
     * @param isDeleted 是否删除（null表示所有用户）
     * @return 用户数量
     */
    Long countUsers(Boolean isActive, Boolean isDeleted);
    
    /**
     * 更新用户活跃状态
     * @param userId 用户ID
     * @param isActive 是否活跃
     * @return 是否更新成功
     */
    boolean updateActiveStatus(Long userId, boolean isActive);
    
    /**
     * 根据昵称搜索用户
     * @param nickname 昵称
     * @param page 分页参数
     * @return 用户分页列表
     */
    IPage<User> searchUsersByNickname(String nickname, Page<User> page);
    
    /**
     * 获取或创建用户
     * @param openid 微信openid
     * @param unionid 微信unionid
     * @param nickname 昵称
     * @param avatarUrl 头像URL
     * @param phone 手机号
     * @return 用户信息
     */
    User getOrCreateUser(String openid, String unionid, String nickname, String avatarUrl, String phone);
    
    /**
     * 获取用户统计数据
     * @param userId 用户ID
     * @return 统计数据
     */
    Map<String, Object> getUserStats(Long userId);
    
    /**
     * 获取伴侣信息
     * @param userId 用户ID
     * @return 伴侣信息
     */
    User getPartnerInfo(Long userId);
    
    /**
     * 绑定情侣关系
     * @param userId 用户ID
     * @param partnerId 伴侣ID
     * @return 是否绑定成功
     */
    boolean bindPartner(Long userId, Long partnerId);
    
    /**
     * 解除情侣关系
     * @param userId 用户ID
     * @return 是否解绑成功
     */
    boolean unbindPartner(Long userId);
    
    /**
     * 查找不活跃用户
     * @param lastActiveTime 最后活跃时间
     * @return 不活跃用户列表
     */
    List<User> findInactiveUsers(LocalDateTime lastActiveTime);
    
    /**
     * 统计活跃用户数量
     * @return 活跃用户数量
     */
    Long countActiveUsers();
    
    /**
     * 统计指定时间范围内的活跃用户数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 活跃用户数量
     */
    Long countActiveUsers(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 统计指定时间范围内的新用户数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 新用户数量
     */
    Long countNewUsers(LocalDateTime startTime, LocalDateTime endTime);
}